$(function(){

	var prod_id = 0;
	var prod_status = 0;
	var tit_art_code = '';
	var tit_prod_num = '';
	var prod_area_full = true;

// Напоминание о выборе строки
	function selRowPlease() {
		app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите строку в таблице.", 'app-icon-stop32');
	}
	function selOnePlease() {
		app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите только одну строку в таблице.", 'app-icon-stop32');
	}
	function isProdNotSel() {
		if( prod_id == 0 ) {
			app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите изделие.", 'app-icon-stop32');
			return true;
		} else return false;
	}
	
	function isProdRelease() {
		if( prod_status & 0x8 ) {
            app.alert('AlertDlg', 'Ошибка', 'В спецификации изделия, прошедшего выпуск, '+
					'никакие изменения не допускаются', 'app-icon-stop32');
			return true;
		} else return false;
	}
	
    function Products(area_id, caller) {
		var area = $('#'+area_id);
		var vdiv = area_id+'Tab';
		var me = this;

		area.html('<div id="'+vdiv+'Pager"></div><table id="'+vdiv+'"></table>');

		var pager_id = '#' + vdiv + 'Pager';
        var pager = $(pager_id);
		
		var el_status;
		var el_start;
		var el_finish;
		
        var el_art_id;
        var el_art_code;
        var el_art_full_name;
        var art_code = '';
		var el_met_name;
		
		var edit_div = 'div#editmod' + vdiv;
		var ai_status = ['',0,2,6,14];
		var as_status = ['Все','Старт','Процес','Финиш','Готово'];
		var op_status = ai_status[0]+':'+as_status[0];
		for( var i=1; i<ai_status.length; i++)
			op_status += ';'+ai_status[i]+':'+as_status[i];

        var gritab;
        var col_order = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
        var col_names = ['ID', 'Статус', 'Начало', 'Прод.ID', 'Шифр', 'Полное описание', 'Кол.', 
						 'Ед.', 'Выпуск', 'Примечание' ];
        var col_model = [
		    { name: 'id', index: 'prod_id', hidden: true, width: 1, editable: false, fixed: true 
			},
		    { name: 'status', index: 'status', hidden: false, width: 80, fixed: true, 
				sortable: true, search: true, editable: true, stype:'select', 
				searchoptions:{value:op_status},
				editoptions: { dataInit: function (el) { el_status = el; } },
				formoptions: { label: '<div class="jqg-form-label">Статус изделия</div>'},
				formatter:function(v) {
					for(var i=0; i<ai_status.length; i++)
						if( ai_status[i] == v) return as_status[i];
					return v;
				},
				unformat:function( v ) {
					for(var i=0; i<ai_status.length; i++)
						if( as_status[i] == v) return ai_status[i];
					return v;
				}

			},
			{ name: 'prod_start', index:'prod_start', hidden: false, width:100, editable: true,
            	editoptions: { style: "width:250px;", dataInit: function (el) { el_start = el; } },
				formoptions: { label: '<div class="jqg-form-label">Дата начала</div>'}
			},         
		    { name: 'prod_art_id', index: 'prod_art_id', hidden: true, width: 1, editable: true, 
                editoptions: { dataInit: function (el) { el_art_id = el; } } 
			}, 					
		    { name: 'art_code', index: 'art_code', hidden: false, width: 100, editable: true, 
                editoptions: { maxlength: "16", style: "width:250px;", dataInit: function (el) { el_art_code = el; }}, 
				formoptions: { label: '<div class="jqg-form-label">Шифр</div>'}
			},					
		    { name: 'art_full_name', index: 'art_full_name', hidden: false, width: 500, sortable: false, 
                editable: true, edittype: 'textarea', editoptions: { maxlength: "255", disabled: 'true',  
				style: "white-space:normal; width:252px; height:50px; resize:none;", dataInit: function (el) { el_art_full_name = el; }}, 
				formoptions: { label: '<div class="jqg-form-label">Описание изделия</div>'} 
			},					
		    { name: 'prod_num', index: 'prod_num', hidden: false, width: 50, 
				editable: true, sortable: false, search: false,
                editoptions: { maxlength: "6", style: "width:250px;" }, 
				formoptions: { label: '<div class="jqg-form-label">Количество</div>'} 
			},					
		    { name: 'met_name', index: 'met_name', hidden: false, width: 40, editable: true, sortable: false, search: false,
		        editoptions: { maxlength: "16", disabled: 'true', style: "width:250px;", dataInit: function (el) { el_met_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Метрика</div>'}
		    },			
			{ name: 'prod_finish', index:'prod_finish', hidden: false, width:100, editable: true,
            	editoptions: { style: "width:250px;", dataInit: function (el) { el_finish = el; } },
				formoptions: { label: '<div class="jqg-form-label">Дата выпуска</div>'}
			},         
		    { name: 'prod_comment', index: 'prod_comment', hidden: false, width: 200, 
				editable: true, sortable: false, search: false,
		        editoptions: { maxlength: "128", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Примечание</div>'}
		    }			
        ];
        var jqgo = {
            url: 'index.php',
            editurl: 'index.php',
            datatype: 'json',
            postData: { q: 'products/listprod' },
            emptyrecords: true,
            autowidth: false,
            gridview: true,
            hidegrid: false,
            hoverrows: true,
            recordpos: 'right',
            scrollrows: true,
            multiselect: true,
            multiselectWidth: 25,
            multiboxonly: true,
            mtype: 'POST',
            shrinkToFit: false,
            colNames: col_names,
            colModel: col_model,
            page: 1,
            pager: pager,
            pagerpos: 'right',
            rowNum: 15,
            rowList: [10, 40, 100],
            loadui: 'disable',
            toolbar: [false, 'top'],
            filterbar: false,
            height: area.innerHeight() - 75,
            width: area.innerWidth() - 2,
            sortname: 'prod_start',
            sortorder: 'desc',
            sortable: true,
            caption: '',
            loadError: function (xhr, status, error) {
                alert("Ошибка загрузки даных");
            },
            loadComplete: function (data) {
                switch( data.userdata.errcode ) {
                    case 0:
                        break;
                    case 99:    
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                        break;
                    default:
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32' );
                        break;
                }                
            },
            ondblClickRow: onEditClick,
			onSelectRow: function( id, st, e ) {
				if( st ) {
					prod_id = id;
					prod_status = gritab.getCell( id, 'status' );
					tit_art_code = gritab.getCell( id, 'art_code' );
					tit_prod_num = gritab.getCell( id, 'prod_num' );
					caller.RefreshSlave();
				}
				else {
					prod_id = 0;
					prod_status = 0;
					tit_art_code = '';
					tit_prod_num = '';
					caller.RefreshSlave();
				}
			}
        };

// Создадим jqGrid
        gritab = $('#' + vdiv).jqGrid(jqgo);

// Индикация серверных ошибок добавления, ред., удал.
        function responseOnSubmit(response, postdata) {
            var rsp = $.parseJSON(response.responseText);
            var success = true;
            var msg = '';

            if (rsp.errcode) return [false, rsp.errmess];
            
			if( postdata.oper == 'del')	{
					prod_id = 0;
					prod_status = 0;
					tit_art_code = '';
					tit_prod_num = '';
					caller.RefreshSlave();
			}
				
            return [success, msg];
        }


// Редактирование
        function onEditClick() { 
			var rowarr = gritab.getGridParam('selarrrow');
			if( rowarr.length == 0 ) { selRowPlease(); return; }
			if( rowarr.length > 1 ) { selOnePlease(); return; }
				
			var status = gritab.getCell( rowarr[0], 'status' );
			if( status & 0x1 ) {
				app.alert('AlertDlg', 'Внимание', "Изменение этой позиции уже запрещено.", 'app-icon-stop32');
				return;
			}
            $.post('index.php', { q: 'products/specstate', prod_id: rowarr[0] }, function (rsp, textStatus) {
                if (rsp.errcode) { app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32'); return; }
				var specstate = rsp.data;
				gritab.jqGrid('editGridRow', rowarr[0], {
					width: 400,
					resize: false,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    editData: { q: 'products/updprod' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:262px;}</style>'); 
					},
                    afterShowForm: function(fm) {
						var elms = $(fm).find(".EditTable tr.FormData");
						elms.hide();
						switch( specstate & 0x6 ) {
							case 0:	elms.filter("tr#tr_prod_start, tr#tr_prod_num, tr#tr_met_name, tr#tr_prod_comment").show(); break;
							case 2:	elms.filter("tr#tr_prod_comment").show(); break;
							case 6:	elms.filter("tr#tr_prod_finish, tr#tr_prod_comment").show(); break;
						}
						BindCalendar(fm, $(el_start));
						BindCalendar(fm, $(el_finish));
						$(edit_div).css({'overflow':'visible'}).shadow();					
					},
                    afterSubmit: responseOnSubmit,
                    viewPagerButtons: false,
                    closeAfterEdit: true,
					onClose: function() {
						$(el_start).datepicker( "destroy" ).unbind();
						$(el_finish).datepicker( "destroy" ).unbind();
					}
				});
            }, 'json');			
		}

// Навигатор - создаем панель инструментов
        gritab.jqGrid('navGrid', pager_id, {
				add:false,del:false,edit:false,view:false,search:false,refresh:false });
        
// Пользовательский навигатор - создать
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Добавить',
            title: 'Создать запись',
            buttonicon: 'ui-icon-plus',
            onClickButton: function() { 
				gritab.jqGrid('editGridRow', 'new', {
					width: 400,
					resize: false,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    editData: { q: 'products/insprod' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:262px;}</style>'); 
					},
                    afterShowForm: function(fm) {
						var elms = $(fm).find(".EditTable tr.FormData");
						elms.hide();
						elms.filter("tr#tr_prod_start, tr#tr_art_code, tr#tr_art_full_name, "+
									"tr#tr_prod_num, tr#tr_met_name, tr#tr_prod_comment").show();
						BindCalendar(fm, $(el_start));
						BindCalendar(fm, $(el_finish));
						SetArtHack();
						$(edit_div).css({'overflow':'visible'}).shadow();
					},
                    afterSubmit: responseOnSubmit,
                    closeAfterAdd: false,
					onClose: function() {
						$(el_art_code).autocomplete( "destroy" ).unbind();
						$(el_start).datepicker( "destroy" ).unbind();
						$(el_finish).datepicker( "destroy" ).unbind();
					}
				});
			}
        });

// Пользовательский навигатор - редактирование
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Изменить',
            title: 'Редактировать выбранную запись',
            buttonicon: 'ui-icon-pencil',
            onClickButton: onEditClick,
        });
		
// Пользовательский навигатор - удаление
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Удалить',
            title: 'Удаление выбранной записи',
            buttonicon: 'ui-icon-trash',
            onClickButton: function() { 
				var status, rowdis = false;
				var rowarr = gritab.getGridParam('selarrrow');
				var rowlist = rowarr.toString();
				if( !rowlist ) { selRowPlease(); return; }
				for( var i = 0; i < rowarr.length; i++ ) {
					status = gritab.getCell( rowarr[i], 'status' );
					if( status & 0x6 ) { rowdis = true; break; }
				}
				if( rowdis ) {
					app.alert('AlertDlg', 'Внимание', "Среди отмеченных присутствуют записи, удаление которых, уже запрещено.", 'app-icon-stop32');
					return;
				}
				gritab.jqGrid('delGridRow', rowlist, {
                    modal: true,
                    jqModal: true,
                    width: 250,
					msg: '<table style="width:240px;margin-top:16px;"><tr><td style="width:50px;">'+
							'<div class="app-icon-quest32"></div></td><td>Удалить выбранную запись(и) ?</td></tr></table>',
					resize: false,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
                    delData: { q: 'products/delprod' },
                    afterShowForm: function() { $('div#delmod' + vdiv).shadow(); },
                    afterSubmit: responseOnSubmit
				});
			}
        });
// Пользовательский навигатор - просмотр
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Просмотр',
            title: 'Показать в виде формы',
            buttonicon: 'ui-icon-document',
            onClickButton: function() { 
				var rowlist = gritab.getGridParam('selarrrow');
				if( rowlist.length == 0 ) { selRowPlease(); return; }
				if( rowlist.length > 1 ) { selOnePlease(); return; }
				gritab.jqGrid('viewGridRow', rowlist[0], {
					width: 400,
					resize: true,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
                    viewPagerButtons: false,
					labelswidth: '35%',
					beforeShowForm: function(fm) {
//						$(fm).find("#v_art_full_name span").css('white-space','normal');
						$(fm).find("table:first td").css({'white-space':'normal','vertical-align':'top'});
						$('div#viewmod' + vdiv).shadow(); 
					}
				});
			}
        });
// Пользовательский навигатор - обновить
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Обновить',
			title: 'Обновить таблицу',
			buttonicon: 'ui-icon-refresh',
			onClickButton: function() { gritab.trigger("reloadGrid"); }
		});    

// Пользовательский навигатор - отправка на склад
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Склад',
			title: 'Отправить на склад готовой продукции',
			buttonicon: 'ui-icon-cart',
			onClickButton: function() {
				var rowarr = gritab.getGridParam('selarrrow');
				if( rowarr.length == 0 ) { selRowPlease(); return; }
				for( var i=rowarr.length-1; i>=0; i-- ) {
					if( ! gritab.getCell( rowarr[i], 'prod_finish' ) ) {
						gritab.setSelection( rowarr[i], false );
					}
				}
				rowarr = gritab.getGridParam('selarrrow');
				if( rowarr.length == 0 ) { selRowPlease(); return; }
				app.confirm('AlertDlg', 'Требуется подтверждение операции', 
					"Передать на склад готовой продукции все отмеченные позиции ?", 'app-icon-quest32', MoveToStock );
				function MoveToStock() {
					var prm = { q: 'products/prodstock', prod_ids: rowarr.toString() };
					$.post('index.php', prm, function (rsp, textStatus) {
						if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
						if (rsp.errcode) {
							app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
						}
						else prod_id = 0;
						caller.RefreshSlave();
						gritab.trigger("reloadGrid");
					}, 'json');
				}
			}
		});    
		
// Пользовательский навигатор - спецификация
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Спецификация',
			title: 'Показать/скрыть спецификацию',
			buttonicon: 'ui-icon-newwin',
			onClickButton: function() {
				if( prod_area_full ) {
					prod_area_full = false;
					area.css('height','40%');
				}
				else {
					prod_area_full = true;
					area.css('height','100%');					
				}
				me.Resize();
			}
		});    

// Делаем ширину панели кнопок максимальной
		$('td#'+area_id+'TabPager_center').width(2);
		
        gritab.filterToolbar({ searchOnEnter: false, afterSearch: function () { } });

// Прикрепить календарь к ячейке поиска
		BindCalendar( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_prod_start") );
		BindCalendar( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_prod_finish") );
		
        function BindCalendar(fm, el) {
            $(el).datepicker({
				onClose: function(dt, inst) {				
					if( $(fm).hasClass('ui-search-toolbar') && dt != '' ) gritab[0].triggerToolbar();
				},
                dateFormat: "dd.mm.yy",
                showOn: "button",
                buttonImage: "img/calendar2.png",
                buttonImageOnly: true,
                buttonText: "Календарь",
                changeMonth: true,
                changeYear: true
            });

            fm.find(".ui-datepicker-trigger")
                .css({ 'cursor': 'pointer', 'position': 'relative', 'left': '-18px', 'top': '3px' });
            $(el).attr("title", "Формат ввода: 'дд.мм.гггг'");                
        }

		
        function SetArtHack() {
            $(el_art_code).autocomplete({
				html: true,
				appendTo: edit_div,
                source: function (request, responce) {
                    $.post('index.php', { q: 'articles/find', term: request.term },
                    function (rsp, textStatus) {
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.art_code + ' ( '+item.art_full_name+' )',
										value: item.art_code, 
										art_id: item.art_id, 
										art_code: item.art_code, 
										art_full_name: item.art_full_name,
										met_name: item.met_name
									}
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 2, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
                    $(el_art_id).val(ui.item.art_id);
                    $(el_art_code).val(ui.item.art_code.replace(/<(b|\/b)>/g,''));
                    $(el_art_full_name).val(ui.item.art_full_name.replace(/<(b|\/b)>/g,''));
                    art_code = $(el_art_code).val();
                    $(el_met_name).val(ui.item.met_name);
                    return false;
                }
            });
            art_code = $(el_art_code).val();
            $(el_art_code).bind( 'focusout', function () { 
                if( $(el_art_code).val() != art_code ) { 
                    art_code = '';
                    $(el_art_id).val('');
                    $(el_art_code).val('');
                    $(el_art_full_name).val('');					
                    $(el_met_name).val('');
                }
            });            
        }

		this.Destroy = function() {
			$("#gview_" + vdiv + " #gs_prod_start").datepicker( "destroy" ).unbind();
			$("#gview_" + vdiv + " #gs_prod_finish").datepicker( "destroy" ).unbind();
			gritab.GridDestroy(vdiv);
			area.empty();
		};
		this.Resize = function() {
			gritab.setGridWidth( area.innerWidth() - 2 );
			gritab.setGridHeight( area.innerHeight() - 75 );
		};
		this.Refresh = function() {
			gritab.trigger("reloadGrid");
		};
		this.rowStatusRefresh = function() {
			var colarr = gritab.getCol('id');
			var visible = false;
			for( var i=0; i<colarr.length; i++ ) { if( colarr[i] == prod_id ) { visible = true; break; } }
			if( !visible ) return;
            $.post('index.php', { q: 'products/prodstatus', prod_id: prod_id },
            function (rsp, textStatus) {
                if (rsp.errcode) {
					app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
					return;
				}
				gritab.setCell( prod_id, 'status', rsp.data );
            }, 'json');
		};


    };  // End of Products function definition


    function Specification(area_id, caller) {
		var area = $('#'+area_id);
		var vdiv = area_id+'Tab';

		area.html('<div id="'+vdiv+'Pager"></div><table id="'+vdiv+'"></table>');

		var pager_id = '#' + vdiv + 'Pager';
        var pager = $(pager_id);
		
		var el_status;
		
        var el_uni_id;
        var el_uni_name;
        var el_uni_full;
        var uni_name = '';
        var el_met_name;
		var el_sto_id;
		var el_amount;
		
		var edit_div = 'div#editmod' + vdiv;

        var gritab;
        var col_order = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
        var col_names = ['Статус', 'ID', 'Материал ID', 'Шифр', 'Полное описание', 'Кол-во', 'Ед.', 'Выписка', 'Склад ID', 'Цена' ];
        var col_model = [
		    { name: 'status', index: 'status', hidden: true, width: 1, fixed: true, 
				sortable: false, search: false, editable: true,
				editoptions: { dataInit: function (el) { el_status = el; } }
			},
		    { name: 'id', index: 'spr_id', hidden: false, width: 100, editable: false, fixed: true, 
				formoptions: { label: '<div class="jqg-form-label">Идентификатор</div>'}
			},
		    { name: 'spr_uni_id', index: 'spr_uni_id', hidden: true, width: 1, editable: true, 
                editoptions: { dataInit: function (el) { el_uni_id = el; } } 
			}, 					
		    { name: 'uni_name', index: 'uni_name', hidden: false, width: 100, editable: true, 
                editoptions: { maxlength: "16", style: "width:250px;", dataInit: function (el) { el_uni_name = el; }}, 
				formoptions: { label: '<div class="jqg-form-label">Шифр</div>'}
			},					
		    { name: 'uni_full', index: 'uni_full', hidden: false, width: 545, sortable:false, 
				editable: true, edittype: 'textarea', editoptions: { maxlength: "255", disabled: 'true', 
				style: "width:252px; height:50px; resize:none;", dataInit: function (el) { el_uni_full = el; }}, 
				formoptions: { label: '<div class="jqg-form-label">Описание</div>'} 
			},					
		    { name: 'spr_amount', index: 'spr_amount', hidden: false, width: 100, sortable: false, search: false, align:'right',
				editable: true, editoptions: { maxlength: "16", style: "width:250px;", dataInit: function (el) { el_amount = el; }}, 
				formoptions: { label: '<div class="jqg-form-label">Количество</div>'} 
			},					
		    { name: 'met_name', index: 'met_name', hidden: false, width: 40, sortable: false, search: false,
				editable: true, editoptions: { maxlength: "16", disabled: 'true', style: "width:250px;", 
				dataInit: function (el) { el_met_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Метрика</div>'}
		    },
			{ name: 'spr_sto_date', index:'spr_sto_date', hidden: false, width:80, editable: false
			},         
		    { name: 'spr_sto_id', index: 'spr_sto_id', hidden: false, width: 100, align:'right', editable: false,
		        editoptions: { value: '', dataInit: function (el) { el_sto_id = el; } },
				formoptions: { label: '<div class="jqg-form-label">Склад, наличие</div>'}
		    },
		    { name: 'sto_price', index: 'sto_price', hidden: false, width: 100, align:'right', 
				sortable: false, search: false, editable: false,
				formoptions: { label: '<div class="jqg-form-label">Цена</div>'},
				formatter:'number', formatoptions:{decimalSeparator:'.',decimalPlaces:2,thousandsSeparator:' '}
		    },
			
        ];
        var jqgo = {
            url: 'index.php',
            editurl: 'index.php',
            datatype: 'json',
            postData: { q: 'products/listuni' },
            emptyrecords: true,
            autowidth: false,
            gridview: true,
            hidegrid: false,
            hoverrows: true,
            recordpos: 'right',
            scrollrows: true,
            multiselect: true,
            multiselectWidth: 25,
            multiboxonly: true,
            mtype: 'POST',
            shrinkToFit: false,
            colNames: col_names,
            colModel: col_model,
            page: 1,
            pager: pager,
            pagerpos: 'right',
            rowNum: 15,
            rowList: [10, 40, 100],
            loadui: 'disable',
            toolbar: [false, 'top'],
            filterbar: false,
            height: area.parent().innerHeight() - 100,
            width: area.parent().innerWidth() - 2,
            sortname: 'uni_name',
            sortorder: 'asc',
            sortable: true,
            caption: '',
            loadError: function (xhr, status, error) {
                alert("Ошибка загрузки даных");
            },
            loadComplete: function (data) {
                switch( data.userdata.errcode ) {
                    case 0:
                        break;
                    case 99:    
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                        break;
                    default:
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32' );
                        break;
                }                
            },
			beforeRequest: function() {
				$('#' + vdiv).jqGrid('setGridParam',{postData:{'prod_id':prod_id} });
			},
            ondblClickRow: onEditClick
        };

// Создадим jqGrid
        gritab = $('#' + vdiv).jqGrid(jqgo);

// Индикация серверных ошибок добавления, ред., удал.
        function responseOnSubmit(response, postdata) {
            var rsp = $.parseJSON(response.responseText);
            var success = true;
            var msg = '';

            if (rsp.errcode > 0) {
                success = false;
                msg = rsp.errmess;
            }
			else if( rsp.errcode < 0 )	//Предупреждения
				app.alert('AlertDlg', 'Предупреждение', rsp.errmess, 'app-icon-warn32');				
			else
				caller.MasterStatusRefresh();
			
            return [success, msg];
        }

		function onShowAddForm(fm) {
			SetUniHack();
            $(edit_div).css({'overflow':'visible'}).shadow();
		}
		        
		function onShowEditForm(fm) {
			SetUniHack();
            $(edit_div).css({'overflow':'visible'}).shadow();
		}
		        
		function onCloseEditForm() {
			$(el_uni_name).autocomplete( "destroy" ).unbind();
			return true;
		}

		function isStockExist( id ) {
			if( gritab.getCell( id, 'spr_sto_id' ) != 0 ) {
				app.alert('AlertDlg', 'Внимание', "Изменение или удаление этой(этих) позиции уже запрещено, "+
						"поскольку она содержит выписку по складу.", 'app-icon-stop32');
				return true;
			} else return false;
		}
	
        function onEditClick() { 
			var rowarr = gritab.getGridParam('selarrrow');
			if( rowarr.length == 0 ) { selRowPlease(); return; }
			if( rowarr.length > 1 ) { selOnePlease(); return; }
			if( isProdNotSel() || isProdRelease() || isStockExist(rowarr[0]) ) return;
			gritab.jqGrid('editGridRow', rowarr[0], {
				width: 400,
				resize: false,
                modal: true,
                jqModal: true,
				zIndex: app.ui_dialog_min_z_index+1,
                editData: { q: 'products/upduni', prod_id: function() { return prod_id; }  },
				onInitializeForm: function( fm ) {
					$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                afterShowForm: onShowEditForm,
                afterSubmit: responseOnSubmit,
                viewPagerButtons: false,
                closeAfterEdit: true,
				onClose: onCloseEditForm
			});
		}
		
// Навигатор - создаем панель инструментов
        gritab.jqGrid('navGrid', pager_id, {
				add:false,del:false,edit:false,view:false,search:false,refresh:false });
        
// Пользовательский навигатор - создать
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Добавить',
            title: 'Создать запись',
            buttonicon: 'ui-icon-plus',
            onClickButton: function() { 
				if( isProdNotSel() || isProdRelease() ) return;
				gritab.jqGrid('editGridRow', 'new', {
					width: 400,
					resize: false,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    editData: { q: 'products/insuni', prod_id: function() { return prod_id; } },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowAddForm,
                    afterSubmit: responseOnSubmit,
                    closeAfterAdd: false,
					onClose: onCloseEditForm
				});
			}
        });

// Пользовательский навигатор - редактирование
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Изменить',
            title: 'Редактировать выбранную запись',
            buttonicon: 'ui-icon-pencil',
            onClickButton: onEditClick
        });
		
// Пользовательский навигатор - удаление
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Удалить',
            title: 'Удаление выбранной записи',
            buttonicon: 'ui-icon-trash',
            onClickButton: function() { 
				var rowarr = gritab.getGridParam('selarrrow');
				if( rowarr.length == 0 ) { selRowPlease(); return; }
				if( isProdNotSel() || isProdRelease() ) return;
				for( var i = 0; i<rowarr.length; i++ ) {
					if( isStockExist(rowarr[i]) ) return;
				}
				gritab.jqGrid('delGridRow', rowarr.toString(), {
                    modal: true,
                    jqModal: true,
                    width: 250,
					msg: '<table style="width:240px;margin-top:16px;"><tr><td style="width:50px;">'+
							'<div class="app-icon-quest32"></div></td><td>Удалить выбранную запись(и) ?</td></tr></table>',
					resize: false,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
                    delData: { q: 'products/deluni', prod_id: function() { return prod_id; }  },
                    afterShowForm: function() { $('div#delmod' + vdiv).shadow(); },
                    afterSubmit: responseOnSubmit
				});
			}
        });
// Пользовательский навигатор - просмотр
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Просмотр',
            title: 'Показать в виде формы',
            buttonicon: 'ui-icon-document',
            onClickButton: function() { 
				var rowarr = gritab.getGridParam('selarrrow');
				if( rowarr.length == 0 ) { selRowPlease(); return; }
				if( rowarr.length > 1 ) { selOnePlease(); return; }
				gritab.jqGrid('viewGridRow', rowarr[0], {
					width: 400,
					resize: true,
                    modal: true,
                    jqModal: true,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
                    viewPagerButtons: false,
					labelswidth: '35%',
					beforeShowForm: function(fm) { 
						$(fm).find("table:first td").css({'white-space':'normal','vertical-align':'top'});
						$('div#viewmod' + vdiv).shadow(); 
					}
				});
			}
        });
// Пользовательский навигатор - обновить
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Обновить',
			title: 'Обновить таблицу',
			buttonicon: 'ui-icon-refresh',
			onClickButton: function() { gritab.trigger("reloadGrid"); }
		});    

// Separator
        gritab.jqGrid('navSeparatorAdd', pager_id );

// Пользовательский навигатор - ручная выписка
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Выписка',
			title: 'Выписать со склада вручную',
			buttonicon: 'ui-icon-arrowstop-1-s',
			onClickButton: function() { 
				var rowarr = gritab.getGridParam('selarrrow');
				if( rowarr.length == 0 ) { selRowPlease(); return; }
				if( rowarr.length > 1 ) { selOnePlease(); return; }
				if( isProdNotSel() || isProdRelease() ) return;
				if( gritab.getCell( rowarr[0], 'spr_sto_id' ) != 0 ) {
					app.alert('AlertDlg', 'Внимание', "Запись содержит выписку по складу, "+
						"Для выполнения новой выписки верните имеющуюся на склад.", 'app-icon-stop32');
					return;
				}
				var param = {
					area_id: area_id,
					spr_id: rowarr[0], 
					uni_id: gritab.getCell( rowarr[0], 'spr_uni_id' ),
					uni_name: gritab.getCell( rowarr[0], 'uni_name' ),
					uni_amount: gritab.getCell( rowarr[0], 'spr_amount' ),					
					refresh: function() { 
						caller.MasterStatusRefresh();
						gritab.trigger("reloadGrid"); 
					}
				};
				GetStockByHand( param );
			}
		});    
		
// Пользовательский навигатор - выписка списком
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Списком',
			title: 'Выписать со склада отмеченные',
			buttonicon: 'ui-icon-arrowthickstop-1-s',
			onClickButton: function() {
				var rowarr = gritab.getGridParam('selarrrow');
				if( rowarr.length == 0 ) { selRowPlease(); return; }
				if( isProdNotSel() || isProdRelease() ) return;
				for( var i=rowarr.length-1; i>=0; i-- ) {
					if( gritab.getCell( rowarr[i], 'spr_sto_id' ) ) {
						gritab.setSelection( rowarr[i], false );
					}
				}
				app.confirm('AlertDlg', 'Требуется подтверждение операции', 
					"Выполнить выписку со склада всех отмеченных позиций ?", 'app-icon-quest32', GetStockList );
				function GetStockList() {
					var prm = { q: 'products/getstocklist', spr_ids: rowarr.toString() };
					$.post('index.php', prm, function (rsp, textStatus) {
						if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
						if (rsp.errcode) app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
						caller.MasterStatusRefresh();
						gritab.trigger("reloadGrid");
					}, 'json');
				}
			}
		});    
		
// Пользовательский навигатор - вернуть списком
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Вернуть',
			title: 'Вернуть на склад отмеченные',
			buttonicon: 'ui-icon-arrowthickstop-1-n',
            onClickButton: function() { 
				var rowarr = gritab.getGridParam('selarrrow');
				if( rowarr.length == 0 ) { selRowPlease(); return; }
				if( isProdNotSel() || isProdRelease() ) return;
				for( var i=rowarr.length-1; i>=0; i-- ) {
					if( !gritab.getCell( rowarr[i], 'spr_sto_id' ) ) {
						gritab.setSelection( rowarr[i], false );
					}
				}
				app.confirm('AlertDlg', 'Требуется подтверждение операции', 
					"Выполнить возврат на склад всех отмеченных позиций ?", 'app-icon-quest32', RetStockList );
				function RetStockList() {
					var prm = { q: 'products/retstocklist', spr_ids: rowarr.toString() };
					$.post('index.php', prm, function (rsp, textStatus) {
						if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
						if (rsp.errcode) app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
						caller.MasterStatusRefresh();
						gritab.trigger("reloadGrid");
					}, 'json');
				}
			}
		});    
		
// Делаем ширину панели кнопок максимальной
		$('td#'+area_id+'TabPager_center').width(2);
		
        gritab.filterToolbar({ searchOnEnter: false, afterSearch: function () { } });
		
// Прикрепить календарь к ячейке поиска
		BindCalendar( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_spr_sto_date") );

        function BindCalendar(fm, el) {
            $(el).datepicker({
				onClose: function(dt, inst) {				
					if( $(fm).hasClass('ui-search-toolbar') && dt != '' ) gritab[0].triggerToolbar();
				},
                dateFormat: "dd.mm.yy",
                showOn: "button",
                buttonImage: "img/calendar2.png",
                buttonImageOnly: true,
                buttonText: "Календарь",
                changeMonth: true,
                changeYear: true
            });

            fm.find(".ui-datepicker-trigger")
                .css({ 'cursor': 'pointer', 'position': 'relative', 'left': '-18px', 'top': '3px' });
            $(el).attr("title", "Формат ввода: 'дд.мм.гггг'");                
        }

        function SetUniHack() {
			$(el_uni_full).prop('readonly', true );
			$(el_met_name).prop('readonly', true );

            $(el_uni_name).autocomplete({
				html: true,
				appendTo: edit_div,
                source: function (request, responce) {
                    $.post('index.php', { q: 'units/find', term: request.term },
                    function (rsp, textStatus) {
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.uni_name + ' ( '+item.uni_full+' )', 
										 uni_id: item.uni_id, 
										 uni_name: item.uni_name,  
										 uni_full: item.uni_full,
										 met_id: item.met_id,
										 met_name: item.met_name
										}
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 2, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
                    $(el_uni_id).val(ui.item.uni_id);
                    $(el_uni_name).val(ui.item.uni_name.replace(/<(b|\/b)>/g,''));
                    $(el_uni_full).val(ui.item.uni_full.replace(/<(b|\/b)>/g,''));
                    uni_name = $(el_uni_name).val();
                    $(el_met_name).val(ui.item.met_name);
                    return false;
                }
            });
			uni_name = $(el_uni_name).val();
            $(el_uni_name).bind( 'focusout', function () { 
                if( $(el_uni_name).val() != uni_name ) { 
                    uni_name = '';
                    $(el_uni_id).val('');
                    $(el_uni_name).val('');
                    $(el_uni_full).val('');					
                    $(el_met_name).val('');
                }
            });            
        }

		this.Destroy = function() {
			$("#gview_" + vdiv + " #gs_spr_sto_date").datepicker( "destroy" ).unbind();
			gritab.GridDestroy(vdiv);
			area.find('*').remove();
		};
		this.Resize = function() {
			gritab.setGridWidth( area.parent().innerWidth() - 2 );
			gritab.setGridHeight( area.parent().innerHeight() - 100 );
		}
		this.Refresh = function() {
			gritab.trigger("reloadGrid");
		}

    };  // End of create function definition


// Выписка со склада вручную
	function GetStockByHand( p ) {
        var oTab;
		var me = this;
		var stock_id = 0;
		var stock_price = 0;

		var dlgID = p.area_id + '_StockSel';
        if ($('#' + dlgID + 'Tab').length) return;
		
		$('#'+p.area_id).parent().append('<div  style="padding:0px;overflow:hidden;" id="'+dlgID+'"></div>');
        var aldlg = $('#' + dlgID);

        aldlg.dialog(
        {
            modal: true, title: 'Наличие материалов на складе по шифру '+p.uni_name,
            height: 252, width: 800,
			closeOnEscape: true,
            autoOpen: false,
            resizable: true,
			resize: function( e, ui ) { oTab.Resize(); },
            open: function () { 
				oTab = new Stock(dlgID, p, me);
				$('div[aria-describedby="' + dlgID + '"]').shadow() 
			},
            close: function () {
                if (oTab) oTab.Destroy();
                aldlg.dialog("destroy");
				aldlg.empty().remove();
            },
			buttons: [ 
				{ 	text: "Выбрать", 
					click: function() { me.Select(); },
					icons: { primary: "ui-icon-check" }
				}, 
				{ 	text: "Отменить", 
					click: function() { $( this ).dialog( "close" ); },
					icons: { primary: "ui-icon-close" }
				} 
			], 
        });

		this.Close = function() { aldlg.dialog('close'); };
		this.Select = function() {
			if( !stock_id ) { selRowPlease(); return; }
			var prm = { q: 'products/getstockone', spr_id: p.spr_id, sto_id: stock_id };
            $.post('index.php', prm, function (rsp, textStatus) {
                if (rsp.errcode) { app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32'); return; }
				p.refresh();
				aldlg.dialog( "close" );
            }, 'json');			
		};

        aldlg.dialog('open');
		$('div[aria-describedby="' + dlgID + '"] .ui-dialog-buttonpane').css('border','none'); 

		function notEnough() {
            app.alert('AlertDlg', 'Ошибка', "Данный материал содержится на складе в недостаточном"+
									" для этой позиции количестве", 'app-icon-stop32' );
		}
        function Stock(area_id, p, caller) {
            var vdiv = area_id+'Tab';
			var area = $('#'+area_id);
    
			area.html('<table id="'+vdiv+'"></table>');
            var gritab;
            var col_names = ['ID', 'Статус', 'Шифр', 'Описание', 'К-во', 'Остаток', 'Ед.', 'Цена', 'Примечание'];
            var col_model = [
			    { name: 'id', index: 'sto_id', width: 60, editable: false },
			    { name: 'status', index: 'status', hidden: true, width: 1, editable: false },
			    { name: 'uni_name', index: 'uni_name', width: 100, editable: false },
			    { name: 'uni_full', index: 'uni_full', width: 300, sortable: false, editable: false },
			    { name: 'sto_number', index: 'sto_number', width: 70, align:'right',
					sortable: false, search: false, editable: false, formatter:'number', 
					formatoptions:{decimalSeparator:'.',decimalPlaces:2,thousandsSeparator:' '}},
			    { name: 'sto_remain', index: 'sto_remain', width: 70,  align:'right',
					search: false, editable: false, formatter:'number', 
					formatoptions:{decimalSeparator:'.',decimalPlaces:2,thousandsSeparator:' '},
			    },
			    { name: 'met_name', index: 'met_name', width: 30, sortable: false, editable: false },
			    { name: 'sto_price', index: 'sto_price', width: 80, align:'right', 
					sortable: false, search: false, editable: false, formatter:'number', 
					formatoptions:{decimalSeparator:'.',decimalPlaces:2,thousandsSeparator:' '},
			    },
			    { name: 'sto_comment', index: 'sto_comment', width: 150, sortable: false, editable: false }
            ];
    
            var jqgo = {
                url: 'index.php',
                editurl: 'index.php',
                datatype: 'json',
//                postData: { q: 'stock/find', uni_id: p.uni_id, uni_amount: p.uni_amount },
                postData: { q: 'products/selstockone', spr_id: p.spr_id },
                autowidth: false,
                gridview: true,
                hoverrows: true,
				// scrollrows: true,
                mtype: 'POST',
                colNames: col_names,
                colModel: col_model,
                rowNum: 100,
                loadui: 'disable',
                toolbar: [false, 'top'],
				toppager: false,
                filterbar: false,
                shrinkToFit: true,
                width: $('#'+area_id).innerWidth() - 2,
                height: $('#'+area_id).innerHeight() - 26,
                sortname: 'sto_id',
                sortorder: 'asc',
                sortable: true,
                caption: '',
                loadError: function (xhr, status, error) {
                    alert("Ошибка загрузки даных");
                },
                loadComplete: function (data) {
                    if( data.userdata.errcode ) {
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                    }
					var row_id, status;
					var stats = gritab.getCol( 'status', true );
					for( var i=0; i<stats.length; i++ ) {
						row_id = stats[i].id;
						status = stats[i].value;
						if( (status & 1 ) == 1 ) {
							gritab.jqGrid('setCell',row_id,'id','','ui-state-error');
						}
					}
                },
				onSelectRow: function( id, st, e ) {
					if( st ) {
						if( gritab.getCell( id, 'status' ) & 0x1 ) { notEnough(); return ; }
						stock_id = id;
						stock_price = gritab.getCell( id, 'sto_price' );
					}
				},
                ondblClickRow: function (id, iRow, iCol) {
					if( gritab.getCell( id, 'status' ) & 0x1 ) { notEnough(); return; }
					stock_id = id;
					stock_price = gritab.getCell( id, 'sto_price' );
					caller.Select();
                }
            };
			
			// Создадим jqGrid
            gritab = $('#' + vdiv).jqGrid(jqgo);
			
			this.Destroy = function() {
				gritab.GridDestroy(vdiv);
				area.empty();
			};
			this.Resize = function() {
				gritab.setGridWidth( area.innerWidth() - 2 );
				gritab.setGridHeight( area.innerHeight() - 26 );
			};
    
		};  // End of create Stock function definition

	} // End of GetStockByHand
	
	
	function ProdProxy() {
		var area;
		var prod_area, spec_area;
		var oProdTab, oSpecTab;
		var active = false;
		var spec_area_title;
		
		this.Open = function( area_id ) {
			if( active  ) return;
			area = area_id;
			$('#'+area+'Title').show();
			prod_area = area_id + '_Prod';
			spec_area = area_id + '_Spec';
			spec_area_title = area_id + '_SpecTitle';
			prod_area_full = true;
			$('#'+area_id).append(
				'<div style="position:absolute;bottom:0;right:0;width:100%;height:60%">'+
					'<span id="'+spec_area_title+'" style="line-height:24px;margin-left:8px;">'+
					'Спецификация к изделию </span>'+
					'<div id="'+spec_area+'"></div>'+
				'</div>'
			);
//			$('#'+area_id).append('<div id="'+
//				spec_area+'" style="position:absolute;bottom:0;right:0;width:100%;height:60%"></div>');
			$('#'+area_id).append('<div id="'+
				prod_area+'" style="position:absolute;top:0;left:0;width:100%;height:100%"></div>');
				
			prod_id = 0;
			oSpecTab = new Specification( spec_area, this ); 
			$(window).bind( 'resize', oSpecTab.Resize );
			oProdTab = new Products( prod_area, this ); 
			$(window).bind( 'resize', oProdTab.Resize );
			active = true;
		};
		this.Close = function() { 
			if( !active  ) return;
			$(window).unbind( 'resize', oProdTab.Resize );
			$(window).unbind( 'resize', oSpecTab.Resize );
			oSpecTab.Destroy();
			oProdTab.Destroy();
			$('#'+area).empty();
			$('#'+area+'Title').hide();
			active = false;
		};
		this.Resize = function() { 
			oSpecTab.Resize(); 
			oProdTab.Resize(); 
		};
		this.RefreshSlave = function() { 
			$('#'+spec_area_title).html('Спецификация к изделию <b>'+tit_art_code+'</b>');
			oSpecTab.Refresh(); 
		};
		this.MasterStatusRefresh = function() { oProdTab.rowStatusRefresh();	}
	}
	
	app.Products = new ProdProxy();
	
    // ---------------------------------------------------------------------------
});
